"""
@name : 3.装饰器的应用
@author : wenyao
@projectname: sanchuanglianxi
"""
#日志记录
# 日志 是一种可以追踪某些软件运行时所发生的时间的方法
#作用： 通过记录和分析日志可以了解一下系统运行情况是否正常，快速定位问题。

#日志等级
#根据一个事件的重要性，划分几个详细等级
#不同的程序所定义的日志等级可能会有所差异，分详细点可以包含如下等级：
#debug
#info
#notice
#warning
#error
#critical
#alert
#emergency

#logging模块记录日志
#python  logging
#logging日志等级：
#debug  #最详细的日志信息
#info   #详细程度仅次于debug，记录关键节点信息
#warning  #当某些不期望的事情发生的时候记录的信息，但是程序是正常运行的
#error   #一个更严重的问题引起了某些功能不能正常运行是记录信息
#critical #发生严重错误，程序不能正常运行时记录信息

#logging.basicConfig 设置日志的相关信息
#第一种：使用logging提供的模块级别函数记录日志
#默认日志等级是warning
# import logging
# logging.basicConfig(filename ="t.log", level = logging.DEBUG)
# logging.debug("This is a debug log")
# logging.info("This is a info log")
# logging.warning("This is a warning log")
# logging.error("This is error log")
# logging.critical("This is critical log")

#第二种方式  使用logging日志系统的组件
#四大组件
#日志器  --》Logger   #提供了应用程序可使用的接口
#处理器  --> Handler  #将logger创建的日志记录发送到合适的目的输出
#过滤器  -->Filter    #更细力度的控制工具来决定输出哪条日志，丢弃哪条日志
#格式器  -->Formatter    # 决定日志最终的输出格式

# import logging
#
# #logging.warning("This is warning ")
# #获取logger对象
# logger = logging.getLogger()
# #root logger 根logger
#
# #创建一个日志输出到文件的Handler对象
# fh = logging.FileHandler("test.log")
#
# #创建一个输出控制台的Handler
# ch = logging.StreamHandler()
#
# #创建一个formatter日志格式
# formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
#
# #绑定formatter到handler上
# fh.setFormatter(formatter)
#
# #绑定handler到logger对象上
# logger.addHandler(fh)
# logger.addHandler(ch)
#
# logger.setLevel(logging.DEBUG)
#logging.basicConfig(level = logging.DEBUG)

# logger.debug("logger debug message")
# logger.info("logger info message")
# logger.warning("logger warning message")
# logger.error("logger error message")
# logger.critical("logger critical message")

#logging.warning("This is warning ")

#创建一个根下的子logger  继承root logger的配置
# logger2 = logging.getLogger(__name__)
# logger2.warning("this is logger2 warning")

#===========================================================================
#log 装饰器
# def func1():
#     print("func1")
#
# func1()   #--自动记录日志 "执行了函数:func1"

#!/bin/python3
#coding=utf-8

import logging
import os
import time

#log装饰器
logger = logging.getLogger()
fh = logging.FileHandler('func.log')
ch = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.addHandler(ch)
logger.setLevel(logging.DEBUG)

# print("aaaaaa")
# logger.debug("this is debug")
# print("bbbbbbb")
# logger.debug("this is debug 2")

def logger1(func):
        def _log(num1, num2):
                logger.setLevel(logging.DEBUG)
                theresult = func(num1, num2)
                print("执行了函数")
                #logger.debug('执行了%s函数'%func.__name__)
                return theresult
        return _log

def cost(func):  #func --> _log
    print("this is cost")
    def _cost(num1,num2):
        start = time.time()
        print("start .........")
        rest = func(num1,num2)
        end = time.time()
        print("cost:",end-start)
        return rest
    return _cost

#--> cost(logger1(add))
# -->logger1(add)(1,2)
@cost
@logger1
# 这两个语法糖相当于  add = cost(logger1(add))
def add(num1, num2):
    time.sleep(1)
    return num1 + num2

#第一步：@logger1   相当于：logger1(add)
#第二部:@cost  相当于:cost(logger1(add))
#执行时：先执行logger1(add) -->返回_log --》cost(_log) -->_cost(1,2)
# tmp = cost(logger1(add))
#logger1(add)  --> _log
# tmp2 = tmp(1,2)
# print(tmp2)
#tmp = cost(logger1(add)(1,2))
# print(f"result is {tmp}")
tmp = add(1,2)
# tmp2 = add(2,3)
print(f"result is {tmp}")
# print(f"tmp2 is {tmp2}")

# #@logger
# def sub(num1, num2):
#         return num1 - num2
# #b = sub(10, 20)
# b = logger1(sub)
# b(10,20)
#
# @logger1
# def func1(a,b):
#     print(a,b)
#
# func1(1,2)